#ifndef BSP_MOTION_H_
#define BSP_MOTION_H_

#include "stdint.h"

#define ENABLE_REAL_WHEEL    (0)
#define YAW_ADJUST           (1)
#define YAW_NO_ADJUST        (0)


 
#define MECANUM_MINI_CIRCLE_MM       (400.203f)     // 轮子一整圈的位移，单位为mm   // The displacement of a wheel in one complete turn, Unit: mm
#define MECANUM_MINI_APB             (164.555f)     // 底盘电机间距之和的一半        // Half of the sum of the chassis motor spacing

//速度限制值
#define CAR_PLUS_MAX_SPEED			(700)

// 停止模式，STOP_FREE表示自由停止，STOP_BRAKE表示刹车。
// Stop mode, STOP_FREE: stop freely, STOP_BRAKE: brake
typedef enum _stop_mode {
    STOP_FREE = 0,
    STOP_BRAKE
} stop_mode_t;

// The speed structure of the car  小车的速度结构体
typedef struct _car_data
{
    int16_t Vx;
    int16_t Vy;
    int16_t Vz;
} car_data_t;

//多小车类型定义
typedef enum _car_type
{
    CAR_TYPE_NONE = 0x00,       // 保留
    CAR_MECANUM = 0x01,         // 小架构小麦轮 X
    CAR_MECANUM_MAX = 0x02,     // 大架构大麦轮 X PLUS
    CAR_FOURWHEEL = 0x04,       // 四轮普通小车 X1
    CAR_ACKERMAN = 0x05,        // 预留阿克曼小车 R2

    CAR_TYPE_MAX                // 最后一个小车类型，仅作为判断
} car_type_t;


void Motion_Stop(uint8_t brake);
void Motion_Set_Pwm(int16_t Motor_1, int16_t Motor_2, int16_t Motor_3, int16_t Motor_4);
void Motion_Ctrl(int16_t V_x, int16_t V_y, int16_t V_z);

void Motion_Get_Encoder(void);
void Motion_Set_Speed(int16_t speed_m1, int16_t speed_m2, int16_t speed_m3, int16_t speed_m4);

void Motion_Handle(void);

void Motion_Get_Speed(car_data_t* car);
float Motion_Get_Circle_MM(void);
float Motion_Get_APB(void);

extern int g_speed_L1;		//临时测试使用
extern int g_speed_L2;		//临时测试使用
extern int g_speed_R1;		//临时测试使用
extern int g_speed_R2;		//临时测试使用


#endif /* BSP_MOTION_H_ */
